﻿//////////////////////////////////////////////////////////////////////////////
//
//  Copyright © 1998-2024 Glodon Company Limited.  All rights reserved.
//
//  Use of this software is subject to the terms of the Glodon license
//  agreement provided at the time of installation or download, or which
//  otherwise accompanies this software in either electronic or hard copy form.  
//
//////////////////////////////////////////////////////////////////////////////


#pragma once
#include "GcmpPickInterface.h"
#include "ContainerUtil.h"
#include "IObject.h"

namespace gcmp
{
    class IDocument;
    class IModelView;
    class IPick;

    /// \brief 候选集，为单例对象，全局唯一
    ///
    /// 当前被拾取到的对象均存于此候选集中
    class GCMP_PICK_INTERFACE_EXPORT IPickCandidates : public IObject
    {
        DEFINE_CAST_DERIVED(IPickCandidates, IObject);
    public:
        /// \brief 获得候选集
        /// \return 候选集指针
        static IPickCandidates* Get();

        /// \brief 清除候选集中内容
        /// \return 成功返回true，失败返回false
        virtual bool Clear() = 0;

        /// \brief 判断候选集是否为空
        /// \return 返回true表示为空，false表示不为空
        virtual bool IsEmpty() const = 0;

        /// \brief 获得候选集中候选项的数量
        /// \return 候选集中图形节点数量
        virtual Int64 GetCount() const = 0;

        /// \brief 向候选集中添加拾取候选项
        /// \param pick 被添加的拾取候选项
        /// \return void
        virtual void AddPick(OwnerPtr<gcmp::IPick> pick) = 0;

        /// \brief 向候选集中添加图形节点引用
        /// \param graphicsNodeReference 被添加的图形节点引用
        /// \return void
        virtual void AddGraphicsNodeReference(const IGraphicsNodeReference& graphicsNodeReference) = 0;

        /// \brief 获得所有的拾取候选项
        /// \return 所有的拾取候选项
        virtual const std::vector<OwnerPtr<gcmp::IPick>>& GetAllPicks() const = 0;

        /// \brief 根据索引获得相应的拾取候选项
        /// \param index 索引
        /// \return 拾取候选项
        virtual const OwnerPtr<IPick>& GetPick(int index) const = 0;

        /// \brief 根据索引删除相应的拾取候选项
        /// \param index 索引
        /// \return void
        virtual void DeletePick(int index) = 0;

        /// \brief 获得当前候选项中的图形节点引用集合
        ///
        /// 如果集合中同时包含对象与其辅助对象，那么辅助对象具有优先被选中的权利
        /// \return 当前候选项中的图形节点引用集合
        virtual const OwnerPtr<IPick>& GetCurrentPick() = 0;

        /// \brief 获得当前候选项索引
        /// \return 当前候选项索引
        virtual int GetCurrentPickIndex() const = 0;

        /// \brief 设置当前候选项索引
        /// \param index 索引
        /// \return void
        virtual void SetCurrentPickIndex(int index) = 0;

        /// \brief 设置默认的当前候选项索引
        ///
        /// 默认当前索引为0, 但是如果候选集中时包含辅助对象，
        /// 那么辅助对象具有优先被选中的权利,即候把选集最前面的候选对象的索引当做默认当前索引。
        /// \param pDocument 当前文档
        /// \return void
        virtual void SetDefaultCurrentPickIndex(const IDocument* pDocument) = 0;

    };
}



